/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tetris_invader.personagens;

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import tetris_invader.util.Fase;
import tetris_invader.util.TimerListener;

/**
 * Classe dos personagens
 */
public abstract class Personagem implements TimerListener, Serializable {

    protected Point point;
    protected int vida;
    protected transient Image imagens[];
    protected Fase f;
    protected int size;

    private void writeObject(ObjectOutputStream oos) throws IOException {
        
        oos.writeObject(point);
        oos.writeInt(vida);
        oos.writeInt(size);
    }

    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        point = (Point) ois.readObject();
        vida = ois.readInt();
        size = ois.readInt();
        imagens = new Image[7];
        for (int i = 0; i < imagens.length; i++) {
            String filename = "/images/" + (i + 1) + ".png";
            URL url = Fabrica.class.getResource(filename);
            imagens[i] = Toolkit.getDefaultToolkit().getImage(url);
            imagens[i] = imagens[i].getScaledInstance(24, 16, 1);
        }

    }

    public Personagem() {
    }

    public Personagem(Fase f) {
        this.f = f;
        this.point = new Point();
        //FIXME posicao na tela;

    }

    public void update() {
        this.deslocamento();
        f.repaint();
    }

    public void setPosition(Point point) {
        this.point.x = point.x;
        this.point.y = point.y;
    }

    /**
     * @return Retorna a posicao no mapa no formato Point
     */
    public Point getPosition() {
        return this.point;
    }

    public int getVida() {
        return vida;
    }

    public void setVida(int vida) {
        this.vida = vida;
    }

    public void addVida(int vida) {
        this.vida += vida;
    }

    public abstract void setVelocidade(float velocidade);

    public abstract void desenha(Graphics2D g2);

    public abstract void deslocamento();

    public abstract void deslocamento(int x, int y);

    /**
     * Funcao que decrementa o valor da quantidade de vidas.
     * @return true se nao ha mais vidas
     */
    public abstract boolean perdeVida();

    public abstract void ataque();

    /**
     * Retorna um variavel dizendo se o erro causado pela aproximacao feita
     * pelo tamanho da imagem e sua passada está no mesmo local de outra
     * imagem
     *
     * @param p Ponto da imagem que se quer comparar
     * @return <i>true</i> se o ponto está na faixa de erro
     */
    public boolean positionError(Point p) {
        return (!((point.x > p.x + size) || (point.x + size < p.x)
                || (point.y > p.y + size) || point.y + size < p.y));
    }

    public boolean erroX(Point p) {

        return (!((point.x > p.x + size) || (point.x + size < p.x)));
    }

    public boolean VerifyPlayer(Object o) {

        if (o instanceof Nave) {
            Nave pers = (Nave) o;

            if (erroX(pers.getPosition())) {
                return true;
            }
        }
        return false;
    }
}
